{
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "# Reduced K-Means Clustering"
      ],
      "metadata": {
        "nteract": {
          "transient": {
            "deleting": false
          }
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "import warnings\n",
        "warnings.filterwarnings(\"ignore\")\n",
        "\n",
        "# yahoo finance used to fetch data \n",
        "import yfinance as yf\n",
        "yf.pdr_override()\n",
        "\n",
        "from sklearn.pipeline import make_pipeline\n",
        "from sklearn.preprocessing import Normalizer\n",
        "from sklearn.cluster import KMeans\n",
        "from sklearn.decomposition import PCA"
      ],
      "outputs": [],
      "execution_count": 1,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-04-05T02:18:20.035Z",
          "iopub.execute_input": "2022-04-05T02:18:20.040Z",
          "shell.execute_reply": "2022-04-05T02:18:21.254Z",
          "iopub.status.idle": "2022-04-05T02:18:21.260Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# input\n",
        "symbols = ['AMD','AAPL','MSFT','GS', 'AMZN', 'GOOGL', 'TSLA', 'INTC']\n",
        "start = '2021-01-01'\n",
        "end = '2022-04-01'\n",
        "\n",
        "\n",
        "# Read data \n",
        "df = yf.download(symbols,start,end)\n",
        "\n",
        "# View Columns\n",
        "df.head()"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "[*********************100%***********************]  8 of 8 completed\n"
          ]
        },
        {
          "output_type": "execute_result",
          "execution_count": 2,
          "data": {
            "text/plain": "             Adj Close                                                   \\\n                  AAPL        AMD         AMZN        GOOGL          GS   \nDate                                                                      \n2021-01-04  128.453445  92.300003  3186.629883  1726.130005  258.902100   \n2021-01-05  130.041626  92.769997  3218.510010  1740.050049  264.695618   \n2021-01-06  125.664215  90.330002  3138.379883  1722.880005  278.979187   \n2021-01-07  129.952286  95.160004  3162.159912  1774.339966  284.938812   \n2021-01-08  131.073929  94.580002  3182.699951  1797.829956  283.404968   \n\n                                                    Close             ...  \\\n                 INTC        MSFT        TSLA        AAPL        AMD  ...   \nDate                                                                  ...   \n2021-01-04  48.050385  215.434967  729.770020  129.410004  92.300003  ...   \n2021-01-05  48.959728  215.642792  735.109985  131.009995  92.769997  ...   \n2021-01-06  49.433750  210.051300  755.979980  126.599998  90.330002  ...   \n2021-01-07  50.488213  216.028732  816.039978  130.919998  95.160004  ...   \n2021-01-08  49.965824  217.344971  880.020020  132.050003  94.580002  ...   \n\n                  Open                 Volume                              \\\n                  MSFT        TSLA       AAPL       AMD     AMZN    GOOGL   \nDate                                                                        \n2021-01-04  222.529999  719.460022  143301900  51802600  4411400  1866200   \n2021-01-05  217.259995  723.659973   97664900  34208000  2655500  1018000   \n2021-01-06  212.169998  758.489990  155088000  51911700  4394800  2329400   \n2021-01-07  214.039993  777.630005  109578200  42897200  3514500  2096800   \n2021-01-08  218.679993  856.000000  105158200  39816400  3537700  1774200   \n\n                                                   \n                 GS      INTC      MSFT      TSLA  \nDate                                               \n2021-01-04  3572000  46102500  37130100  48638200  \n2021-01-05  4207100  24866600  23823000  32245200  \n2021-01-06  6383500  36809600  35930700  44700000  \n2021-01-07  4009700  32092300  27694500  51498900  \n2021-01-08  2800800  34625400  22956200  75055500  \n\n[5 rows x 48 columns]",
            "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead tr th {\n        text-align: left;\n    }\n\n    .dataframe thead tr:last-of-type th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr>\n      <th></th>\n      <th colspan=\"8\" halign=\"left\">Adj Close</th>\n      <th colspan=\"2\" halign=\"left\">Close</th>\n      <th>...</th>\n      <th colspan=\"2\" halign=\"left\">Open</th>\n      <th colspan=\"8\" halign=\"left\">Volume</th>\n    </tr>\n    <tr>\n      <th></th>\n      <th>AAPL</th>\n      <th>AMD</th>\n      <th>AMZN</th>\n      <th>GOOGL</th>\n      <th>GS</th>\n      <th>INTC</th>\n      <th>MSFT</th>\n      <th>TSLA</th>\n      <th>AAPL</th>\n      <th>AMD</th>\n      <th>...</th>\n      <th>MSFT</th>\n      <th>TSLA</th>\n      <th>AAPL</th>\n      <th>AMD</th>\n      <th>AMZN</th>\n      <th>GOOGL</th>\n      <th>GS</th>\n      <th>INTC</th>\n      <th>MSFT</th>\n      <th>TSLA</th>\n    </tr>\n    <tr>\n      <th>Date</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>2021-01-04</th>\n      <td>128.453445</td>\n      <td>92.300003</td>\n      <td>3186.629883</td>\n      <td>1726.130005</td>\n      <td>258.902100</td>\n      <td>48.050385</td>\n      <td>215.434967</td>\n      <td>729.770020</td>\n      <td>129.410004</td>\n      <td>92.300003</td>\n      <td>...</td>\n      <td>222.529999</td>\n      <td>719.460022</td>\n      <td>143301900</td>\n      <td>51802600</td>\n      <td>4411400</td>\n      <td>1866200</td>\n      <td>3572000</td>\n      <td>46102500</td>\n      <td>37130100</td>\n      <td>48638200</td>\n    </tr>\n    <tr>\n      <th>2021-01-05</th>\n      <td>130.041626</td>\n      <td>92.769997</td>\n      <td>3218.510010</td>\n      <td>1740.050049</td>\n      <td>264.695618</td>\n      <td>48.959728</td>\n      <td>215.642792</td>\n      <td>735.109985</td>\n      <td>131.009995</td>\n      <td>92.769997</td>\n      <td>...</td>\n      <td>217.259995</td>\n      <td>723.659973</td>\n      <td>97664900</td>\n      <td>34208000</td>\n      <td>2655500</td>\n      <td>1018000</td>\n      <td>4207100</td>\n      <td>24866600</td>\n      <td>23823000</td>\n      <td>32245200</td>\n    </tr>\n    <tr>\n      <th>2021-01-06</th>\n      <td>125.664215</td>\n      <td>90.330002</td>\n      <td>3138.379883</td>\n      <td>1722.880005</td>\n      <td>278.979187</td>\n      <td>49.433750</td>\n      <td>210.051300</td>\n      <td>755.979980</td>\n      <td>126.599998</td>\n      <td>90.330002</td>\n      <td>...</td>\n      <td>212.169998</td>\n      <td>758.489990</td>\n      <td>155088000</td>\n      <td>51911700</td>\n      <td>4394800</td>\n      <td>2329400</td>\n      <td>6383500</td>\n      <td>36809600</td>\n      <td>35930700</td>\n      <td>44700000</td>\n    </tr>\n    <tr>\n      <th>2021-01-07</th>\n      <td>129.952286</td>\n      <td>95.160004</td>\n      <td>3162.159912</td>\n      <td>1774.339966</td>\n      <td>284.938812</td>\n      <td>50.488213</td>\n      <td>216.028732</td>\n      <td>816.039978</td>\n      <td>130.919998</td>\n      <td>95.160004</td>\n      <td>...</td>\n      <td>214.039993</td>\n      <td>777.630005</td>\n      <td>109578200</td>\n      <td>42897200</td>\n      <td>3514500</td>\n      <td>2096800</td>\n      <td>4009700</td>\n      <td>32092300</td>\n      <td>27694500</td>\n      <td>51498900</td>\n    </tr>\n    <tr>\n      <th>2021-01-08</th>\n      <td>131.073929</td>\n      <td>94.580002</td>\n      <td>3182.699951</td>\n      <td>1797.829956</td>\n      <td>283.404968</td>\n      <td>49.965824</td>\n      <td>217.344971</td>\n      <td>880.020020</td>\n      <td>132.050003</td>\n      <td>94.580002</td>\n      <td>...</td>\n      <td>218.679993</td>\n      <td>856.000000</td>\n      <td>105158200</td>\n      <td>39816400</td>\n      <td>3537700</td>\n      <td>1774200</td>\n      <td>2800800</td>\n      <td>34625400</td>\n      <td>22956200</td>\n      <td>75055500</td>\n    </tr>\n  </tbody>\n</table>\n<p>5 rows × 48 columns</p>\n</div>"
          },
          "metadata": {}
        }
      ],
      "execution_count": 2,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-04-05T02:18:21.266Z",
          "iopub.execute_input": "2022-04-05T02:18:21.269Z",
          "iopub.status.idle": "2022-04-05T02:18:22.252Z",
          "shell.execute_reply": "2022-04-05T02:18:22.447Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "stock_open = np.array(df['Open']).transpose()\n",
        "stock_close = np.array(df['Close']).transpose()\n"
      ],
      "outputs": [],
      "execution_count": 3,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-04-05T02:18:22.258Z",
          "iopub.execute_input": "2022-04-05T02:18:22.263Z",
          "iopub.status.idle": "2022-04-05T02:18:22.274Z",
          "shell.execute_reply": "2022-04-05T02:18:22.451Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "movements = stock_close - stock_open\n",
        "\n",
        "sum_of_movement = np.sum(movements,1)"
      ],
      "outputs": [],
      "execution_count": 4,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-04-05T02:18:22.281Z",
          "iopub.execute_input": "2022-04-05T02:18:22.285Z",
          "iopub.status.idle": "2022-04-05T02:18:22.293Z",
          "shell.execute_reply": "2022-04-05T02:18:22.454Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "for i in range(len(symbols)):\n",
        "    print('Symbols:{}, Change:{}'.format(df['High'].columns[i],sum_of_movement[i]))\n"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Symbols:AAPL, Change:40.60997009277344\n",
            "Symbols:AMD, Change:-31.269943237304688\n",
            "Symbols:AMZN, Change:-801.45068359375\n",
            "Symbols:GOOGL, Change:-34.5792236328125\n",
            "Symbols:GS, Change:-15.619964599609375\n",
            "Symbols:INTC, Change:-5.630008697509766\n",
            "Symbols:MSFT, Change:34.880035400390625\n",
            "Symbols:TSLA, Change:-27.66082763671875\n"
          ]
        }
      ],
      "execution_count": 5,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-04-05T02:18:22.301Z",
          "iopub.execute_input": "2022-04-05T02:18:22.306Z",
          "iopub.status.idle": "2022-04-05T02:18:22.315Z",
          "shell.execute_reply": "2022-04-05T02:18:22.457Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Define, Fit, and transform a Normalizer\n",
        "normalizer = Normalizer()\n",
        "norm_movements = normalizer.fit_transform(movements) \n"
      ],
      "outputs": [],
      "execution_count": 6,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-04-05T02:18:22.321Z",
          "iopub.execute_input": "2022-04-05T02:18:22.325Z",
          "iopub.status.idle": "2022-04-05T02:18:22.331Z",
          "shell.execute_reply": "2022-04-05T02:18:22.461Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Create Kmeans model\n",
        "normalizer = Normalizer()\n",
        "kmeans = KMeans(max_iter = 1000)\n",
        "pipeline = make_pipeline(normalizer,kmeans)\n",
        "pipeline.fit(movements)\n",
        "labels = pipeline.predict(movements)"
      ],
      "outputs": [],
      "execution_count": 7,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-04-05T02:18:22.337Z",
          "iopub.execute_input": "2022-04-05T02:18:22.341Z",
          "iopub.status.idle": "2022-04-05T02:18:22.347Z",
          "shell.execute_reply": "2022-04-05T02:18:22.465Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "df1 = pd.DataFrame({'labels':labels,'Symbols':symbols}).sort_values(by=['labels'],axis = 0)\n",
        "df1 = df1.set_index('Symbols')\n",
        "print('\\n')\n",
        "print(df1)"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\n",
            "\n",
            "         labels\n",
            "Symbols        \n",
            "AMD           0\n",
            "GOOGL         1\n",
            "AMZN          2\n",
            "TSLA          3\n",
            "AAPL          4\n",
            "MSFT          5\n",
            "INTC          6\n",
            "GS            7\n"
          ]
        }
      ],
      "execution_count": 8,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-04-05T02:18:22.353Z",
          "iopub.execute_input": "2022-04-05T02:18:22.356Z",
          "iopub.status.idle": "2022-04-05T02:18:22.365Z",
          "shell.execute_reply": "2022-04-05T02:18:22.468Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Reduce the data\n",
        "normalizer = Normalizer()\n",
        "reduced_data = PCA(n_components = 2)\n",
        "kmeans = KMeans(max_iter = 1000)\n",
        "pipeline = make_pipeline(normalizer,reduced_data,kmeans)\n",
        "pipeline.fit(movements)\n",
        "labels = pipeline.predict(movements)"
      ],
      "outputs": [],
      "execution_count": 9,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-04-05T02:18:22.371Z",
          "iopub.execute_input": "2022-04-05T02:18:22.376Z",
          "iopub.status.idle": "2022-04-05T02:18:22.382Z",
          "shell.execute_reply": "2022-04-05T02:18:22.471Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "df2 = pd.DataFrame({'labels':labels,'Symbols':symbols}).sort_values(by=['labels'],axis = 0)\n",
        "df2 = df2.set_index('Symbols')\n",
        "print('\\n')\n",
        "print(df2)"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\n",
            "\n",
            "         labels\n",
            "Symbols        \n",
            "INTC          0\n",
            "TSLA          1\n",
            "AMZN          2\n",
            "GOOGL         3\n",
            "AMD           4\n",
            "AAPL          5\n",
            "GS            6\n",
            "MSFT          7\n"
          ]
        }
      ],
      "execution_count": 10,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-04-05T02:18:22.387Z",
          "iopub.execute_input": "2022-04-05T02:18:22.391Z",
          "shell.execute_reply": "2022-04-05T02:18:22.475Z",
          "iopub.status.idle": "2022-04-05T02:18:22.402Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Reduce the data\n",
        "reduced_data = PCA(n_components = 2).fit_transform(norm_movements)\n",
        "h = 0.01\n",
        "x_min,x_max = reduced_data[:,0].min()-1, reduced_data[:,0].max() + 1\n",
        "y_min,y_max = reduced_data[:,1].min()-1, reduced_data[:,1].max() + 1\n",
        "xx,yy = np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))\n",
        "Z = kmeans.predict(np.c_[xx.ravel(),yy.ravel()])\n",
        "Z = Z.reshape(xx.shape)\n",
        "cmap = plt.cm.Paired"
      ],
      "outputs": [],
      "execution_count": 11,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-04-05T02:18:22.409Z",
          "iopub.execute_input": "2022-04-05T02:18:22.416Z",
          "iopub.status.idle": "2022-04-05T02:18:22.426Z",
          "shell.execute_reply": "2022-04-05T02:18:22.478Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "plt.clf()\n",
        "plt.figure(figsize=(10,10))\n",
        "plt.imshow(Z,interpolation = 'nearest',extent=(xx.min(),xx.max(),yy.min(),yy.max()),cmap = cmap,aspect = 'auto',origin = 'lower')\n",
        "plt.plot(reduced_data[:,0],reduced_data[:,1],'k.',markersize = 5)\n",
        "\n",
        "# Plot the centroid of each cluster as a white X\n",
        "centroids = kmeans.cluster_centers_\n",
        "plt.scatter(centroids[:,0],centroids[:,1],marker = 'x',s = 169,linewidths = 3,color = 'w',zorder = 10)\n",
        "plt.title('K-Means Clustering on Stock Market Movements (PCA-Reduced Data)')\n",
        "plt.xlim(x_min,x_max)\n",
        "plt.ylim(y_min,y_max)\n",
        "plt.show()"
      ],
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": "<Figure size 432x288 with 0 Axes>"
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": "<Figure size 720x720 with 1 Axes>",
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "execution_count": 12,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-04-05T02:18:22.435Z",
          "iopub.execute_input": "2022-04-05T02:18:22.441Z",
          "iopub.status.idle": "2022-04-05T02:18:22.578Z",
          "shell.execute_reply": "2022-04-05T02:18:22.584Z"
        }
      }
    }
  ],
  "metadata": {
    "kernel_info": {
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.6.13",
      "mimetype": "text/x-python",
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "pygments_lexer": "ipython3",
      "nbconvert_exporter": "python",
      "file_extension": ".py"
    },
    "kernelspec": {
      "argv": [
        "C:/Users/Tin Hang/Anaconda3\\python.exe",
        "-m",
        "ipykernel_launcher",
        "-f",
        "{connection_file}"
      ],
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "nteract": {
      "version": "0.28.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}